Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Как правильно задать запрос? (SoftDed)
Author Message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Sun Mar 26, 2006 7:58 pm (написано за 10 минут 51 секунду)
   Post subject: Как правильно задать запрос?
Reply with quote

Как правильно задать запрос, вот такая ситуация:
Есть 2 таблицы, надо из одной базы, перенести информацию в другую, но проблема заключаеться в том, что в той таблице, куда надо переносить, немного другаю структура, а именно:
Во второй таблице есть только 1 столбец, в каждой строчке имееться информация, которая разделяеться тегом <more> ,а таблца, в которую нужно перенести данные, имеет 2 столбца: в 1 столбец, надо перенести то, что находиться ДО <more> , а вот 2 столбец, надо перенести информацию, которая находиться ПОСЛЕ тэга <more>.
Если можете напишите код, который будет переностиь информацию из одной базы в другую, либо дайте пожалуйсто пример, в котором описано как примерно это можно сделать.
Я конечно, почти незнаю PHP, но догадываюсь, что если создать 2 переменные, в которые будут поступать данные. Тоесть примерно вот так вот:
Получить данные из таблицы, из которой надо получить данные -> прочитать и поместить то, что до <more> в переменную $1 ,а то, что после тэга <more> в пременную $2 -> из $1 записать в таблицу 1 ,а $2 записать в таблицу 2 -> удалить перенесенную строку.
А дальше пойдет также, пока не закончаться строки.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 8:52 am (спустя 12 часов 53 минуты; написано за 5 минут 56 секунд)
   Post subject:
Reply with quote

SoftDed
смотрите в сторону конкатенации строк. В PHP: www.php.net/manual/ru/language.operators.string.php , в MySQL: CONCAT (dev.mysql.com/doc/refman/4.1/en/string-functions.html#id3136142) .
Так что если дополнительных условий нет, то можно это реализовать одним запросом, через
Code (SQL): скопировать код в буфер обмена
INSERT ... SELECT ...
// исправлено.
Тьфу, Вы так путано поставили вопрос. Похоже, Вам нужна ровно обратная задача: php.net/explode и LOCATE (dev.mysql.com/doc/refman/4.1/en/string-functions.html#id3137362) , SUBSTR (dev.mysql.com/doc/refman/4.1/en/string-functions.html#iid3139563) . Всё равно можно сделать одним запросом, хотя конструкция будет несколько громоздкой - аналога php-шного explode() в MySQL мне неизвестно.
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 10:45 am (спустя 1 час 53 минуты; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Соединяемся с mySQL, далее таблицу post, в ней ищем строку с id='1' , далее в этой строке ищем столбец content , информацию из контента вносим в масив post[0] , далее пишем команду эксплойда
Code (php): скопировать код в буфер обмена
$news = explode (www.php.net/explode)("<more>", $post[0]); //
 
Далее удоляем строку с id='1'
Далее отсоединяемься от базы и соединаемся с базой куда надо перенести информацию, ищем таблицу post, далее ищем строку с id='1' , далее переносим информацию из масива post[1] в столбец post_home // то что на главной
далее переносим информацию из масива post[2] в столбец post_more // то что внутри
Далее отсоединяемся от базы.

Сегодня попробую написать. Если что, напишу сюда. А так, Вы очень помогли, спасибо.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 10:59 am (спустя 14 минут; написано за 7 минут 53 секунды)
   Post subject:
Reply with quote

SoftDed
зачем столько лишних телодвижений?
1) если все происходит в пределах одной БД, используете один линк. Если две БД с различным набором хост-юзер-пароль, то - два. Сначала открываете соединение с источником, потом -с приемником.
2) делаете SELECT-запрос без LIMITа. Пусть указатель на результат будет в $result1
3) внутри
Code (php): скопировать код в буфер обмена
while ($row = mysql_fetch_assoc (www.php.net/mysql_fetch_assoc)($result1) ) {
    // ...
}
4) разбиваете нужное поле, формируете новый запрос и исполняете его:
Code (php): скопировать код в буфер обмена
$result2 = mysql_query (www.php.net/mysql_query)($sql [, $link_identifier] );
Если все без ошибок - идете дальше. Если ошибка -выдаётё сооббщение.
5) После завершения, если необходимо, очищаете (TRUNCATE) или удаляете (DROP) исходную таблицу.
6) Закрываете соединения, в обратном порядке.
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 11:44 am (спустя 44 минуты; написано за 24 секунды)
   Post subject:
Reply with quote

Нет, моих знаний не хватит сделать это, попробую сначало как у меня написано.
Back to top
View user's profile Send private message Send e-mail
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 12:37 pm (спустя 53 минуты; написано за 3 минуты 45 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
<?php
   /* Соединяемся, выбираем базу данных */
   $link = mysql_connect (www.php.net/mysql_connect)("localhost", "root", "")
       or die (www.php.net/die)("Не соеденино : " . mysql_error (www.php.net/mysql_error)());
   print (www.php.net/print) "Подключились";
   mysql_select_db (www.php.net/mysql_select_db)("blog") or die (www.php.net/die)("Не найдена база");

   /* Выполняем SQL-запрос */
   $query = "SELECT `post_content` FROM `wp_posts` WHERE ID = '5'";
   $result = mysql_query (www.php.net/mysql_query)($query) or die (www.php.net/die)("Запрос не верен: " . mysql_error (www.php.net/mysql_error)());

 while ($line = mysql_fetch_array (www.php.net/mysql_fetch_array)($result, MYSQL_ASSOC)) {
       print (www.php.net/print) "\t<tr>\n";
       foreach ($line as $col_value) {
           $news = explode (www.php.net/explode)("<!--more-->", $col_value);
print (www.php.net/print) $news[0];
print (www.php.net/print) $news[1];
       }
       print (www.php.net/print) "\t</tr>\n";
   }


?>
Вот, он выдает все, что мне надо, сначало то, что до more, а потом то, что после more. Щас только надо сделать так, чтобы php вписал все, из news[0] в один столбец, а news[1] в другой. И еще надр както сделать так, чтобы WHERE ID = '5' всегда становилась на 1 больше. И что будет, если у меня иногда пропуски идут, например 1, 2, 3, 5, 6, 7, 9 и т.д.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 1:38 pm (спустя 1 час 44 секунды; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

SoftDed
цикл Вам нужн, цикл.
Вроде
Code (php): скопировать код в буфер обмена
    $ids = array (www.php.net/array)(1, 2, 3, 5, 6, 7, 9);
    $query = "SELECT `post_content` FROM `wp_posts` WHERE ID IN (".implode(', ', $ids).") ORDER BY ID"; // по сравнению с плейсхолдерами смотрится страшно и дыряво
    $result = mysql_query (www.php.net/mysql_query)($query) or die (www.php.net/die)("Запрос не верен: " . mysql_error (www.php.net/mysql_error)());
   
    while ($line = mysql_fetch_assoc (www.php.net/mysql_fetch_assoc)($result)) {
        print (www.php.net/print) "\t<tr>\n";
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 7:07 pm (спустя 5 часов 29 минут; написано за 37 секунд)
   Post subject:
Reply with quote

А если у меня 794 записи, их все прописывать? :(
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 7:13 pm (спустя 5 минут; написано за 23 секунды)
   Post subject:
Reply with quote

SoftDed
а по какому принципу Вы их отбираете?
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 7:24 pm (спустя 11 минут; написано за 1 минуту 21 секунду)
   Post subject:
Reply with quote

Их надо перенести все, только иногда удолялись записи, вот и образуються пробелы.
Code (php): скопировать код в буфер обмена
<?php
   /* Соединяемся, выбираем базу данных */
   $link = mysql_connect (www.php.net/mysql_connect)("localhost", "root", "")
       or die (www.php.net/die)("Не соеденино : " . mysql_error (www.php.net/mysql_error)());
   print (www.php.net/print) "Подключились";
   mysql_select_db (www.php.net/mysql_select_db)("blog") or die (www.php.net/die)("Не найдена база");

   /* Выполняем SQL-запрос */
   $query = "SELECT `post_content` FROM `wp_posts` WHERE ID = '6'";
   $result = mysql_query (www.php.net/mysql_query)($query) or die (www.php.net/die)("Запрос не верен: " . mysql_error (www.php.net/mysql_error)());

 while ($line = mysql_fetch_array (www.php.net/mysql_fetch_array)($result, MYSQL_ASSOC)) {
       print (www.php.net/print) "\t<tr>\n";
       foreach ($line as $col_value) {
           $news = explode (www.php.net/explode)("<!--more-->", $col_value);
$table = mysql_query (www.php.net/mysql_query)("SELECT dle_post FROM blog");
$table[0] = mysql_query (www.php.net/mysql_query)("INSERT INTO short_story VALUES ('$news[0]')");
$table[1] = mysql_query (www.php.net/mysql_query)("INSERT INTO full_story VALUES ('$news[1]')");
       }
       print (www.php.net/print) "\t</tr>\n";
   }
?>
Что-то не получаеться, что не так, можете подсказать?
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 7:33 pm (спустя 8 минут; написано за 2 минуты 50 секунд)
   Post subject:
Reply with quote

SoftDed
раз пробелы - выкиньте блок WHERE вообще. Всё равно в результате ID есть. А есл иВы хотите и ID пустые убрать - явно перечислите в INSERT все поля, кроме ID - оно ведь у Вас автоинкремент?
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 8:10 pm (спустя 37 минут; написано за 41 секунду)
   Post subject:
Reply with quote

Я так и не понял, что вы хотите мне сказать. А вовще да, ID создаеться сам.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Mar 27, 2006 8:51 pm (спустя 40 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

SoftDed wrote:
$table = mysql_query("SELECT dle_post FROM blog");
$table[0] = mysql_query("INSERT INTO short_story VALUES ('$news[0]')");
$table[1] = mysql_query("INSERT INTO full_story VALUES ('$news[1]')");
Ой, а это что?
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Mon Mar 27, 2006 9:58 pm (спустя 1 час 7 минут; написано за 15 секунд)
   Post subject:
Reply with quote

Я попытался записать данные в таблицу
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Mar 28, 2006 12:12 pm (спустя 14 часов 13 минут; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

SoftDed
в две разных таблицы! Но меня сильно смущает, как Вы обращаетесь с переменной $table. Вы уверены в ссвоих действиях?
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Mar 28, 2006 12:43 pm (спустя 30 минут; написано за 31 секунду)
   Post subject:
Reply with quote

Я перенес все в 1 таблицу, значит $table мне уже не нужно, будем значит думать, как жить дальше.
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Mar 28, 2006 1:47 pm (спустя 1 час 4 минуты; написано за 3 минуты 1 секунду)
   Post subject:
Reply with quote

Чего Вы перенесли? Вы сделали SELECT-запрос и даже не посмотрели - а правильно ли он исполнился? И вообще, что этот запрос вернул? Спрашивается - зачем было запрашивать?
В общем, мне это надоело
Code (SQL): скопировать код в буфер обмена
DROP TABLE IF EXISTS `recipient`;
CREATE TABLE `recipient` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`short_story` TEXT NOT NULL ,
`full_story` TEXT NOT NULL
) ENGINE = MYISAM ;

INSERT INTO `recipient` (`short_story`,`full_story`)
SELECT SUBSTRING( `post_content` , 1, LOCATE( '<!--more-->', `post_content` ) -1 ) AS 'p1', SUBSTRING( `post_content` , LOCATE( '<!--more-->', `post_content` ) +11 ) AS 'p2'
FROM `wp_posts`
ORDER BY `id`;
Только учтите: если в тексте строки не найдется '<!--more-->' - будет ошибка. Это можно обойти, обернув в IF() - но уж с этим Вы как-нибудь справитесь.
Вопросы есть?
Back to top
View user's profile Send private message
SoftDed
Участник форума



Joined: 05 Dec 2004
Posts: 87
Карма: -21
   поощрить/наказать

Location: Москва

PostPosted: Fri Apr 07, 2006 8:16 am (спустя 9 дней 18 часов 28 минут; написано за 25 секунд)
   Post subject:
Reply with quote

Да вобщемто нет, спасибо большое.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Apr 07, 2006 9:00 am (спустя 44 минуты)
   Post subject:
Reply with quote


М

Тема закрыта.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML